package mao.mashibing.juc.atest;

import java.sql.Time;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

/*
user：mao
data：2020/11/22
explain：淘宝面试题：写一个线程安全的容器，第一个线程向容器中添加10个元素
第二个线程监测到第一个线程添加到第五个元素时打印值，并结束。
*/
public class WithSynchronized<T> {
    List<T> list = new LinkedList<>();

    public void add(T t) {
        list.add(t);
    }

    public int size() {
        return list.size();
    }

    public static void main(String[] args) throws Exception {
        WithSynchronized<Object> objectWithSynchronized = new WithSynchronized<>();
        //锁定Object如何保证线程之间objectWithSynchronized的可见性
        Object lock = new Object();
        //这个线程必需先启动，否则发生奇怪现象
        new Thread(() -> {
            synchronized (lock) {
                while (objectWithSynchronized.size() != 5) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("监测到第五个了");
                lock.notify();
                System.out.println("after notify");
            }
        }).start();
        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {

                    synchronized (lock) {
                        if (i == 5) {
                            lock.notify();
                            //释放锁，让监测线程先打印输出
                            lock.wait();
                        }
                        objectWithSynchronized.add(new Object());
                        System.out.println("生产第" + i + "个了");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}
